from flask import jsonify

from common.exception.exception_enum import BusiExceptionEnum


class ResponseCode:
    """
    定义HTTP响应状态码的常量类。
    """
    SUCCESS = 200        # 成功请求
    BAD_REQUEST = 400    # 客户端错误请求
    NOT_FOUND = 404      # 请求资源未找到
    INTERNAL_ERROR = 500 # 服务器内部错误


def success_response(data=None, message="Success"):
    """
    构建成功的HTTP响应。

    参数:
    - data: 响应数据，默认为None
    - message: 响应消息，默认为"Success"

    返回:
    - 包含状态、代码、消息和数据的JSON响应，状态码为200
    """
    response = {
        "status": "success",
        "code": ResponseCode.SUCCESS,
        "message": message,
        "data": data
    }
    return jsonify(response), ResponseCode.SUCCESS


def error_response(code, busi_code=None, message="Error"):
    """
    构建错误的HTTP响应。

    参数:
    - code: HTTP状态码
    - busi_code: 业务错误码
    - message: 错误消息，默认为"Error"

    返回:
    - 包含状态、代码、消息和数据的JSON响应，状态码为指定的错误码
    """
    response = {
        "status": "error",
        "code": code if not busi_code else busi_code,
        "message": message,
        "data": None
    }
    return jsonify(response), code


def bad_request(message="Bad Request"):
    """
    构建400错误的HTTP响应。

    参数:
    - message: 错误消息，默认为"Bad Request"

    返回:
    - 包含状态、代码、消息和数据的JSON响应，状态码为400
    """
    return error_response(code=ResponseCode.BAD_REQUEST, message=message)


def not_found(message="Not Found"):
    """
    构建404错误的HTTP响应。

    参数:
    - message: 错误消息，默认为"Not Found"

    返回:
    - 包含状态、代码、消息和数据的JSON响应，状态码为404
    """
    return error_response(code=ResponseCode.NOT_FOUND, message=message)


def internal_error(message="Internal Server Error"):
    """
    构建500错误的HTTP响应。

    参数:
    - message: 错误消息，默认为"Internal Server Error"

    返回:
    - 包含状态、代码、消息和数据的JSON响应，状态码为500
    """
    return error_response(code=ResponseCode.INTERNAL_ERROR, message=message)


def busi_error(exception_enum: BusiExceptionEnum):
    """
        构建业务错误的HTTP响应。

        参数:
        - message: 错误消息

        返回:
        - 包含状态、代码、消息和数据的JSON响应
        """
    return error_response(code=200, busi_code=exception_enum.code, message=exception_enum.message)